/**
 * Description:     对bmp位图进行灰度增强操作。
 * Function:        void initGaryscale(GARYSCALEBIT *image)       初始化灰度数组
                    void linearEnhancement(GARYSCALEBIT *image, int a, int b)     线性灰度增强
                    void exponentialEnhancement(GARYSCALEBIT *image, int a, int b)    指数灰度增强
                    void freeGaryscale(GARYSCALEBIT *image)         释放分配的内存
 * Solution:        如果你在使用本头文件时发现了任何问题，请报告issue.
 * Contributer:     张紫瑶
 */


#ifndef IMGG_H
#define IMGG_H

//包含 bmp.h 以使用位图文件进行灰度图像处理
#ifndef bmp_h
#define bmp_h
#include "bmp.h"
#endif

// 临时定义 grayscalebit 结构
#ifndef grayscalebit
#define grayscalebit
typedef struct
{
    unsigned char *garyscale;      // 指向灰度值数组（像素）的指针
    unsigned int dataCount;        // 图像中的像素总数
    int direction;                 // 图像中像素数据的方向（正或负）
    int biWidth;                   // @bmp图片的宽度（以像素为单位）
    int biHeight;                  // @bmp图片的高度。负值表示从上到下的方向
} GARYSCALEBIT;
#endif

// 声明 imgG.c 的相关函数
 
// C支持C++调用,确保在使用 imgen.cpp 时可以链接 imgG 中相关函数
#ifdef __cplusplus
extern "C" {
#endif

    /** 初始化 GARYSCALEBIT 结构中的灰度数组; 根据图像尺寸为灰度像素数据分配内存
    * 参数：
    * - image：指向包含图像数据的 GARYSCALEBIT 结构的指针
    */
    void initGaryscale(GARYSCALEBIT *image);


    /** 线性灰度增强：使用线性变换调整图像的亮度对比度
    * 参数：
    * - image：指向包含图像数据的 GARYSCALEBIT 结构的指针
    * - a：对比度因子（乘以灰度值）
    * - b：亮度因子（向灰度值添加偏移量）
    * 公式：g'(x, y) = a * g(x, y) + b
    */
    void linearEnhancement(GARYSCALEBIT *image, int a, int b);


    /** 指数灰度增强：使用指数变换调整图像的亮度对比度
    * 参数：
    * - image：指向包含图像数据的 GARYSCALEBIT 结构的指针
    * - a：强度调整的比例参数
    * - b：调整增强程度的指数参数
    */
    void exponentialEnhancement(GARYSCALEBIT *image, int a, int b);


    /** 释放灰度数组的动态分配内存；将指针设置为null
    * 参数：
    * - image：指向包含图像数据的 GARYSCALEBIT 结构的指针
    */
    void freeGaryscale(GARYSCALEBIT *image);


#ifdef __cplusplus
}
#endif

#endif
